package SparkGraphXInAction

import org.apache.spark._
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.graphx._
import org.apache.spark.graphx.Graph._
import org.apache.spark.rdd.RDD
import org.apache.spark.graphx.util.GraphGenerators

/**
  * Created by Administrator on 2017/4/23 0023.
  */
object GenerateGraph {
  def main(args: Array[String]): Unit = {
    //设置运行环境
    val conf = new SparkConf().setAppName("SimpleGraphX").setMaster("local")
    val sc = new SparkContext(conf)

//    //生成网格图，网格图不存在随机性，并且网格是完整的。
//    val gridgraph = GraphGenerators.gridGraph(sc,4,4)
//    val list_vertices = gridgraph.vertices.collect()
//    println("展示图的顶点:")
//    for(vertice <- list_vertices){
//      println(vertice)
//    }
//    val list_edges = gridgraph.edges.collect()
//    println("展示图的边：")
//    for(edge <- list_edges){
//      println(edge)
//    }
//    val list_triplets = gridgraph.triplets.collect()
//    println("展示图的边三元组:")
//    for(triplet <- list_triplets){
//      println(triplet)
//    }

//    //生成星形图，星形图不存在随机性。
//    val stargraph = GraphGenerators.starGraph(sc,8)
//    val stargraph_vertices = stargraph.vertices.collect()
//    println("展示图的顶点:")
//    for(vertice <- stargraph_vertices){
//      println(vertice)
//    }
//    val stargraph_edges = stargraph.edges.collect()
//    println("展示图的边：")
//    for(edge <- stargraph_edges){
//      println(edge)
//    }
//    val stargraph_triplets = stargraph.triplets.collect()
//    println("展示图的边三元组:")
//    for(triplet <- stargraph_edges){
//      println(triplet)
//    }


//    //生成随机图：对数正态图。
//    //对数正态图（log normal graph）关注的是生成图的每个顶点出度值分布。它保证在对所有的出度值绘制直方图时，你可以看到一个对数正态分布的形状
//    //（高斯钟形曲线），这意味着log(d)服从正态分布。(d代表顶点的度值)
//    val logNormalGraph = GraphGenerators.logNormalGraph(sc,15)
//    val lognormal_vertices = logNormalGraph.aggregateMessages[Int](_.sendToSrc(1), _ + _).collect()
//    println("展示图的顶点:")
//    for(vertice <- lognormal_vertices){
//      println(vertice)
//    }



    //基于程序化流程的:R-MAT图
    //R-MAT，代表递归矩阵。用于模拟典型的社交网络架构。与之前的基于度值的logNormalGraph()函数相反，rmatGraph()进行“程序化”的过程。
    //它根据预先设定的每个象限的概率，每次将边添加到图的某个象限中（再到象限中的象限，递归进行）。
    //rmatGraph函数的第二个和第三个参数是要求的顶点数和独立的边数。
    val rmatgraph = GraphGenerators.rmatGraph(sc, 32, 60)
    //rmatGraph的递归象限分割，会留下一些相对鼓励的顶点，同事会让一些顶点群组高度内聚。
    //rmatGraph假设作为参数传递进来的顶点数是2的每次。如果不是，rmatGraph会自动将它增大到最近的2的幂次方值。它需要顶点数是2的幂次的形式，用于
    //递归地进行象限的分割。rmatGraph在开始的时候，会把顶点放在网格里，然后随机地逐一生成边，基于递归象限的概率来选择边的顶点。
    //一些顶点有可能最终没有边与它们相连。

  }
}
